package event;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

/**
 * Created with IntelliJ IDEA
 * Description:事件处理机制学习
 * User:22954
 * Date:2024-03-01
 * Time:20:07
 */

public class Event extends JFrame {
    /*
    事件源:事件源是一个对象(鼠标,窗口,键盘...),事件源会产生事件
    事件:事件是一个对象(随事件源的状态改变而产生),该对象包含当前事件源的信息(KeyEvent对象包含键盘被按下键的Code值...)
         java.swt.event包和java.swing.event包中定义了各种事件类型
    事件监听者:事件监听者是一个类,实现了事件监听器接口,负责接受事件(对象)并处理
              事件监听器接口有多种(对应事件和事件源),一个事件监听者(类)可以实现多个事件监听器(接口)
              java.swt.event包和java.swing.event包中定义了各种事件监听器接口
     */
    Panel panel = null;
    public static void main(String[] args) {
        new Event();
    }
    public Event(){
        panel = new Panel();
        super.add(panel);
        super.setSize(600,400);
        //addKeyListener(KeyListener l) 该函数使得窗口JFrame对象可以监听键盘事件,即可以监听到面板发生的键盘事件
        super.addKeyListener(panel);
        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.setVisible(true);
    }
}
class Panel extends JPanel implements KeyListener{//实现监听键盘的接口
    int x = 10;
    int y = 10;
    @Override
    public void paint(Graphics g) {
        super.paint(g);
//        g.fillRect(0,0,600,400);
        g.fillOval(x,y,20,20);
    }
    /*
    有字符输入时,该方法触发
     */
    @Override
    public void keyTyped(KeyEvent e) {
//        if(e.getKeyChar() == KeyEvent.VK_UP){
            x+=3;
            super.repaint();
//        }
    }
    /*
    有按键被按下时,该方法触发
     */
    @Override
    public void keyPressed(KeyEvent e) {
        /*
        e接受键盘信息
        每一个键盘对应一个code,对标KeyEvent里面定义的静态常量 VK_...
         */
        if(e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_S){
            y+=2;
            super.repaint();
        }
    }
    /*
    有按键被松开时,该方法触发
     */
    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_UP){
            y-=2;
            super.repaint();
        }
    }
}
